import threading
import time

# 共享的数据列表
shared_list = []
# 创建一个锁对象
lock = threading.Lock()

# 定义写入数据的函数，模拟线程向共享列表中写入数据
def write_data():
    global shared_list
    for i in range(5):
        # 获取锁，确保同一时间只有一个线程能操作共享列表
        lock.acquire()
        shared_list.append(i)
        print(f"线程 {threading.current_thread().name} 写入数据: {i}")
        # 释放锁，允许其他线程获取锁进行操作
        lock.release()
        time.sleep(0.1)  # 模拟写入操作的耗时

# 定义读取数据的函数，模拟线程从共享列表中读取数据
def read_data():
    global shared_list
    for _ in range(5):
        # 获取锁
        lock.acquire()
        if shared_list:
            data = shared_list.pop(0)
            print(f"线程 {threading.current_thread().name} 读取数据: {data}")
        else:
            print(f"线程 {threading.current_thread().name} 发现列表为空，无数据可读取")
        # 释放锁
        lock.release()
        time.sleep(0.2)  # 模拟读取操作的耗时

if __name__ == "__main__":
    # 创建写入线程
    write_thread1 = threading.Thread(target=write_data, name="WriteThread1")
    write_thread2 = threading.Thread(target=write_data, name="WriteThread2")

    # 创建读取线程
    read_thread1 = threading.Thread(target=read_data, name="ReadThread1")
    read_thread2 = threading.Thread(target=read_data, name="ReadThread2")

    # 启动写入线程
    write_thread1.start()
    write_thread2.start()

    # 启动读取线程，注意要在写入线程启动之后启动，以保证有数据可读
    read_thread1.start()
    read_thread2.start()

    # 等待所有线程执行完毕
    write_thread1.join()
    write_thread2.join()
    read_thread1.join()
    read_thread2.join()
    print("所有线程执行完毕，最终共享列表内容:", shared_list)